/*
 * @Author: Leung
 * @Date: 2025-07-21 19:52:46
 * @LastEditTime: 2025-07-30 22:33:36
 * @FilePath: \Projecte:\STM32F103ZET6\Peripheral modules\EEPROM_AT24C02\I2C_Soft\User\usart\bsp_usart.c
 * @Description: 
 * 
 * Copyright (c) 2025 by ${git_name_email}, All Rights Reserved. 
 */
#include "./usart/bsp_usart.h"


void USART_Config(void)
{
    USART_InitTypeDef USART_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    /* 打开串口和GPIO外设的时钟 */
    DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);
    DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);

    /* 串口工作参数配置 */
	USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;      // 配置波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;     // 配置 针数据字长
	USART_InitStructure.USART_StopBits = USART_StopBits_1;          // 配置停止位
	USART_InitStructure.USART_Parity = USART_Parity_No ;            // 配置校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;     // 配置硬件流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;     // 接收模式和发送模式
	USART_Init(DEBUG_USARTx, &USART_InitStructure);     // 完成串口的初始化配置
    USART_Cmd(DEBUG_USARTx, ENABLE);        // 使能串口

    /* 将USART Tx的GPIO配置为 推挽复用 输出模式 */
    GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

    /* 将USART Rx的GPIO配置为 浮空 输入模式 */
    GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
}


/* 重定向C库的 printf 函数，重定向后串口可以使用printf函数打印输出 */
int fputc(int ch, FILE *f)
{
    /* 通过串口发送一个字节数据 */
    USART_SendData(DEBUG_USARTx, (uint8_t) ch);
    /* USART_FLAG_TXE: Transmit data register empty flag */
    while (!USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE));     // 等待发送完成，即发送数据寄存器为空
    
    return (ch);
}


/* 重定向C库的 scanf()和getchar() 函数，重定向后串口可以使用 scanf()和getchar() 等函数 */
int fgetc(FILE *f)
{
    /* USART_FLAG_RXNE: Receive data register not empty flag */
    while (!USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE));    // 等待串口输入数据，即接收数据寄存器不为空
    
    return (int)USART_ReceiveData(DEBUG_USARTx);
}
